#!/bin/bash

process_u() {
    if [ ! -z "${2##*[!0-9]*}" ]; then
        # Single shared static ID.
        echo "user($1) = $2"
        echo "group($1) = $2"
    elif [[ $2 == *:* ]]; then
        # UID:<group>.
        uid=$(echo $2 | cut -d':' -f1 -)
        group=$(echo $2 | cut -d':' -f2 -)
        if [ ! -z "${group##*[!0-9]*}" ]; then
            # UID:GID.
            echo "user($1) = ${uid}"
            echo "group($1) = ${group}"
        else
            # UID:<groupname>.
            echo "user($1) = ${uid}"
            echo "group(${group})"
        fi
    else
        # Dynamic (or something else uninteresting).
        echo "user($1)"
        echo "group($1)"
    fi
}

process_g() {
    if [ ! -z "${2##*[!0-9]*}" ]; then
        # Static GID.
        echo "group($1) = $2"
    else
        # Dynamic (or something else uninteresting).
        echo "group($1)"
    fi
}

parse() {
    while read line; do
        [ "${line:0:1}" = '#' -o "${line:0:1}" = ';' ] && continue
        line="${line## *}"
        [ -z "$line" ] && continue
        set -- $line
        case "$1" in
            ('u')
                process_u "$2" "$3"
                ;;
            ('g')
                process_g "$2" "$3"
                ;;
            ('m')
                echo "user($2)"
                echo "group($3)"
                ;;
        esac
    done
}

while read fn; do
    parse < "$fn"
done
